﻿#include <iostream>
#include <vector>
#include <string>
#include "Field.h"
#include "Row.h"
#include "Table.h"
#include "Database.h"
#include "command.h"

int main() {
    //进入交互界面
    std::string command;
    while (std::getline(std::cin, command)) {
        if (command == "QUIT;" || command == "quit;") break;
        execute_command(command);
    }


    // 创建数据库
    std::cout << "// 创建数据库" << std::endl;
    Database db("TestDB");

    // 创建 Users 表
    std::cout << "\n// 创建 Users 表" << std::endl;
    std::vector<std::string> user_fields = { "ID", "Name", "Email" };
    std::vector<std::string> user_types = { "int", "string", "string" };
    db.CreateTable("Users", user_fields, user_types);

    // 创建 Orders 表
    std::cout << "\n// 创建 Orders 表" << std::endl;
    std::vector<std::string> order_fields = { "ID", "UserID", "Amount", "Date" };
    std::vector<std::string> order_types = { "int", "int", "double", "string" };
    db.CreateTable("Orders", order_fields, order_types);

    // 向 Users 表添加初始数据
    std::cout << "\n// 向 Users 表添加初始数据" << std::endl;
    std::vector<std::vector<std::string>> user_data = {
        {"1", "John Doe", "john@example.com"},
        {"2", "Jane Smith", "jane@example.com"},
        {"3", "Mike Johnson", "mike@example.com"},
        {"4", "Emily Brown", "emily@example.com"},
        {"5", "David Wilson", "david@example.com"}
    };

    for (const auto& row : user_data) {
        db.AddRowToTable("Users", row);
    }

    // 向 Orders 表添加初始数据
    std::cout << "\n// 向 Orders 表添加初始数据" << std::endl;
    std::vector<std::vector<std::string>> order_data = {
        {"1", "1", "100.50", "2023-05-01"},
        {"2", "2", "200.75", "2023-05-02"},
        {"3", "1", "50.25", "2023-05-03"},
        {"4", "3", "150.00", "2023-05-04"},
        {"5", "2", "75.80", "2023-05-05"}
    };

    for (const auto& row : order_data) {
        db.AddRowToTable("Orders", row);
    }

    // 打印初始数据
    std::cout << "\n// 打印初始数据" << std::endl;
    std::cout << "Initial data:" << std::endl;
    db.PrintAll();

    // 查询 Users 表中 Name 为 "John Doe" 的行索引
    std::cout << "\n// 查询 Users 表中 Name 为 \"John Doe\" 的行索引" << std::endl;
    std::vector<int> user_indexes = db.FindIndexesFromTable("Users", "Name", "John Doe");
    std::cout << "Indexes of rows with Name 'John Doe' in Users table: ";
    for (const auto& index : user_indexes) {
        std::cout << index << " ";
    }
    std::cout << std::endl;

    // 查询 Orders 表中 UserID 为 "2" 的行索引
    std::cout << "\n// 查询 Orders 表中 UserID 为 \"2\" 的行索引" << std::endl;
    std::vector<int> order_indexes = db.FindIndexesFromTable("Orders", "UserID", "2");
    std::cout << "Indexes of rows with UserID '2' in Orders table: ";
    for (const auto& index : order_indexes) {
        std::cout << index << " ";
    }
    std::cout << std::endl;

    // 更新 Users 表中 ID 为 "1" 的行的 Email
    std::cout << "\n// 更新 Users 表中 ID 为 \"1\" 的行的 Email" << std::endl;
    user_indexes = db.FindIndexesFromTable("Users", "ID", "1");
    db.UpdateRowToTable("Users", user_indexes, { "Email" }, { "john.doe@example.com" });

    // 更新 Orders 表中 ID 为 "3" 的行的 Amount 和 Date
    std::cout << "\n// 更新 Orders 表中 ID 为 \"3\" 的行的 Amount 和 Date" << std::endl;
    order_indexes = db.FindIndexesFromTable("Orders", "ID", "3");
    db.UpdateRowToTable("Orders", order_indexes, { "Amount", "Date" }, { "60.00", "2023-05-06" });

    // 打印更新后的数据
    std::cout << "\n// 打印更新后的数据" << std::endl;
    std::cout << "Updated data:" << std::endl;
    db.PrintAll();

    // 从 Users 表中删除 ID 为 "4" 的行
    std::cout << "\n// 从 Users 表中删除 ID 为 \"4\" 的行" << std::endl;
    user_indexes = db.FindIndexesFromTable("Users", "ID", "4");
    db.DeleteFromTable("Users", user_indexes);

    // 从 Orders 表中删除 Amount 等于 "150" 的行
    std::cout << "\n// 从 Orders 表中删除 Amount 等于 \"150\" 的行" << std::endl;
    order_indexes = db.FindIndexesFromTable("Orders", "Amount", "150");
    db.DeleteFromTable("Orders", order_indexes);

    // 打印删除后的数据
    std::cout << "\n// 打印删除后的数据" << std::endl;
    std::cout << "Data after deletion:" << std::endl;
    db.PrintAll();

    // 向 Users 表添加一个新行
    std::cout << "\n// 向 Users 表添加一个新行" << std::endl;
    db.AddRowToTable("Users", { "6", "Sophia Davis", "sophia@example.com" });

    // 向 Orders 表添加一个新行
    std::cout << "\n// 向 Orders 表添加一个新行" << std::endl;
    db.AddRowToTable("Orders", { "6", "3", "80.50", "2023-05-07" });

    // 打印添加新行后的数据
    std::cout << "\n// 打印添加新行后的数据" << std::endl;
    std::cout << "Data after adding new rows:" << std::endl;
    db.PrintAll();

    // 选择 Users 表中 ID 为 "2" 和 "3" 的行,仅显示 Name 和 Email 列
    std::cout << "\n// 选择 Users 表中 ID 为 \"2\" 和 \"3\" 的行,仅显示 Name 和 Email 列" << std::endl;
    user_indexes = db.FindIndexesFromTable("Users", "ID", "2");
    user_indexes.push_back(db.FindIndexesFromTable("Users", "ID", "3")[0]);
    db.SelectFromTable("Users", user_indexes, { "Name", "Email" });

    // 选择 Orders 表中 UserID 为 "1" 的行,仅显示 Amount 和 Date 列
    std::cout << "\n// 选择 Orders 表中 UserID 为 \"1\" 的行,仅显示 Amount 和 Date 列" << std::endl;

    order_indexes = db.FindIndexesFromTable("Orders", "UserID", "1");
    db.SelectFromTable("Orders", order_indexes, { "Amount", "Date" });

    // 将数据库保存到文件
    std::cout << "\n// 将数据库保存到文件" << std::endl;
    db.SaveToFile("test_db.txt");

    // 从文件加载数据库
    std::cout << "\n// 从文件加载数据库" << std::endl;
    Database loaded_db("Loaded");
    loaded_db.LoadFromFile("test_db.txt");

    // 打印加载后的数据库
    std::cout << "\n// 打印加载后的数据库" << std::endl;
    std::cout << "Loaded database:" << std::endl;
    loaded_db.PrintAll();

    return 0;
}